#include "app_output.h"
#include "app_can.h"
extern io_t * gp_io;

/**
 * @brief 输出自动更新函数，根据结构体参数gp_io中的数据自动更新；
 * 如果使用结构体中的输出功能，该函数必须保留；
 * 如果使用PWMi的功能，该函数必须放到1ms定时器中；
 */
void output_update(void) 
{
	uint32_t i = 0;

  for(i = 0; i < HEM_DO_NUM;i++)
  {
    //前18纯DO
    if(i < 18) 
    {
      do_out(i,gp_io->dout[i]);
    }
    //处理2路PWM和DO复用
    if((i >= 18) && (i < 20))
    {
      if(gp_io->pwm[i-18] >0)
      {
        drv_pwm_set_duty((i-18),gp_io->pwm[i-18]);
      }
      else if(gp_io->dout[i] > 0)
      {
        drv_pwm_set_duty((i-18),MAX_DUTY_VALUE);
      }
      else
      {
        drv_pwm_set_duty((i-18),0);
      }
    }

    if(i >= 20)
    {
      if(gp_io->pwmi[i-20]>0)
      {
        pwm_set_curr(i-20,gp_io->pwmi[i-20]);
      }
      else if(gp_io->pwm[i-18]>0)
      {
        drv_pwm_set_duty(i-18,gp_io->pwm[i-18]);
      }
      else if(gp_io->dout[i]>0)
      {
        drv_pwm_set_duty((i-18),MAX_DUTY_VALUE);
      }
      else
      {
        drv_pwm_set_duty((i-18),0);
      }
    }
  }

#if HEM_AO_NUM > 0
  for (i = 0; i<HEM_AO_NUM; i++) 
  {
    drv_dac_set_ao(i, gp_io->ao[i]);
  }
#endif
}
